	/**
	 * author: fangqk
	 * PC端文件上传低耦合闭包js，适合有一定js基础的你
	 * 注意：需要依赖jQuery
	 * new Promise(resolve, reject)处理异步方法结果回调，配合catch一次抓取任何异常，避免回调地狱
	 * 其他异步回调如process上传进度的回调写在方法参数表中即可对外暴露
	 */
	var FileUpload = function(initData) {
		/**
		 * fileId：input:file的id
		 * uploadUrl：后台接受文件的URL地址
		 * maxSize：文件的最大大小，大于这个值不能上传
		 * minSize：文件的最小大小，小于这个值不能上传
		 */
		var data = {
			fileId: 'fileInput',
			uploadUrl: '/fileController/uploadFile',
			maxSize: 1.0*1024*1024,
			minSize: 100*1024,
			allowType: ['txt','doc','rar','zip','xml','ppt']
		}
		
		var init = function() {
			// 如果initData有传值，则以initData的参数值为准，否则使用data中的默认值
	        $.extend(data, initData);
	    }
		
		init();
		
		/**
		 * 对外暴露的方法要以this.methodName = function(){} 声明，其他不能暴露的方法则用普通方法声明
		 * 上传成功回调方法callback，失败或异常回调方法errBack
		 * @param fileId
		 * @returns
		 */
		this.fileChange = function(callback, process, errBack) {
			var fileEl = document.getElementById(data.fileId);
			var file = fileEl.files[0];
			if(file==null){
				return errBack("您未选择任何文件！");
			}
			
			var fileName = file.name.toLowerCase();
			//获取文件后缀名
			var typeName = fileName.substring(fileName.lastIndexOf('.') + 1);
			if(!validateType(typeName, data.allowType)){
				return errBack("不支持您上传的"+ typeName +"格式文件");
			}

			var size = file.size;
			if(size < data.minSize){
				return errBack("您上传的"+ fileName +"文件不能小于"+ data.minSize/1024 +"Kb");
			}else if(size > data.maxSize){
				return errBack("您上传的"+ fileName +"文件不能大于"+ data.maxSize/1024 +"Kb");
			}
			
			uploadFile(file, process).then(function(retData) {
				callback(retData);
			}).catch(function(errMsg){
				if(errMsg){
					return errBack(errMsg);
				}
			})
		}
		
		/**
		 * 判断文件是否为支持的类型
		 * @param typeName
		 * @param allowType
		 * @returns
		 */
		function validateType(typeName,allowType) {
			for(var i=0;i<allowType.length;i++){
				if(typeName==allowType[i]){
					return true;
				}
			}
			return false;
		}
		
		/**
		 * 
		 * @param form
		 * @returns
		 */
		function uploadFile(file, process) {
			return new Promise(function(callback, err) {
				$.ajax({
					url: data.uploadUrl,
					type: "post",
					data: {fileItem: file},
					processData: false,
					contentType: false,
					dataType: "json",
					error: function() {
						return err("服务器错误，请稍后再试...");
					},
					success: function(retData){
						callback(retData);
					},
					xhr:function(){ //在jquery函数中直接使用ajax的XMLHttpRequest对象
						var xhr = new XMLHttpRequest();
						xhr.upload.addEventListener("progress", function(evt){
							if (evt.lengthComputable) {
								var percentComplete = Math.round(evt.loaded * 100 / evt.total);
								process(percentComplete.toString()+"%");
							}
						}, false);
						return xhr;
					}
				});
			})
		}
	}